import os
import sys
import logging
from logging.handlers import RotatingFileHandler
from datetime import datetime
import pytz
import colorlog


def create_log_directory(log_file):
    """
    创建日志文件目录（如果不存在）。

    参数:
    - log_file: 日志文件的完整路径。
    """
    log_dir = os.path.dirname(log_file)
    os.makedirs(log_dir, exist_ok=True)


def configure_log_handlers(app, log_file):
    """
    配置日志处理器。

    参数:
    - log_file: 日志文件的完整路径。

    返回:
    - log_handlers: 日志处理器列表。
    """
    log_handlers = [
        RotatingFileHandler(
            filename=log_file,
            maxBytes=app.config.get("MAX_BYTES"),  # 每个日志文件的最大大小（1GB）
            backupCount=app.config.get("BACKUP_COUNT"),  # 保留的旧文件数量
        ),
        logging.StreamHandler(sys.stdout),  # 控制台输出处理器
    ]
    # 为控制台输出处理器设置颜色
    log_format = app.config.get("LOG_FORMAT")
    console_handler = log_handlers[1]
    console_formatter = colorlog.ColoredFormatter(
        fmt=f'%(log_color)s{log_format}',  # 打印日志格式
        datefmt=app.config.get("LOG_DATEFORMAT"),  # 打印日期格式
        log_colors={
            'DEBUG': 'light_cyan',
            'INFO': 'light_white',
            'WARNING': 'light_yellow',
            'ERROR': 'light_red',
            'CRITICAL': 'light_black,bg_green',
        }
    )
    console_handler.setFormatter(console_formatter)
    return log_handlers


def configure_logging(app, log_handlers=None):
    """
    配置日志的基本设置。

    参数:
    - app: Flask 应用实例，从中读取配置信息。
    - log_handlers: 日志处理器列表。
    """
    logging.basicConfig(
        level=app.config.get("LOG_LEVEL"),  # 日志级别
        format=app.config.get("LOG_FORMAT"),  # 日志格式
        datefmt=app.config.get("LOG_DATEFORMAT"),  # 日期格式
        handlers=log_handlers,  # 日志处理器
        force=True,  # 强制重新配置日志
    )


def adjust_log_time(app):
    """
    根据配置调整日志时间。

    参数:
    - app: Flask 应用实例，从中读取配置信息。
    """
    log_tz = app.config.get("LOG_TZ")
    if log_tz:
        timezone = pytz.timezone(log_tz)

        def time_converter(seconds):
            """将 UTC 时间转换为指定时区的时间。"""
            return datetime.utcfromtimestamp(seconds).astimezone(timezone).timetuple()

        for handler in logging.root.handlers:
            handler.formatter.converter = time_converter


def init_log(app):
    """
    初始化日志配置。

    参数:
    - app: Flask 应用实例，从中读取配置信息。
    """
    file_name = f"fm_{datetime.now().strftime('%Y_%m_%d')}.log"
    _dir = app.config.get("LOG_DIR")
    log_file = f'{_dir}/{file_name}'
    if _dir:
        create_log_directory(log_file)
        log_handlers = configure_log_handlers(app, log_file)
    else:
        raise ValueError("LOG_DIR not configured.")
    configure_logging(app, log_handlers)
    adjust_log_time(app)
